﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FirstApp.App_Code;
namespace FirstApp
{
        public class Klient
        {
                AdventureWorksLTEntities dbcontext = new AdventureWorksLTEntities();
                private int _id;

                public int Id
                {
                        get { return _id; }
                        set { _id = value; }
                }
                private string _nazwaFirmy;

                public string NazwaFirmy
                {
                        get { return _nazwaFirmy; }
                        set { _nazwaFirmy = value; }
                }
                private string _imiePrzedstawiciela;

                public string ImiePrzedstawiciela
                {
                        get { return _imiePrzedstawiciela; }
                        set { _imiePrzedstawiciela = value; }
                }
                private string _nazwiskoPrzedstawiciela;

                public string NazwiskoPrzedstawiciela
                {
                        get { return _nazwiskoPrzedstawiciela; }
                        set { _nazwiskoPrzedstawiciela = value; }
                }
                private string _telefon;

                public string Telefon
                {
                        get { return _telefon; }
                        set { _telefon = value; }
                }
                private string _email;

                public string Email
                {
                        get { return _email; }
                        set { _email = value; }
                }
                private double _sumaZamowien;

                public double SumaZamowien
                {
                        get { return _sumaZamowien; }
                        set { _sumaZamowien = value; }
                }

                private int _iloscZamowien;

                public int IloscZamowien
                {
                        get { return _iloscZamowien; }
                        set { _iloscZamowien = value; }
                }

                private List<Adres> _adresy;

                public List<Adres> Adresy
                {
                        get { return _adresy; }
                        set { _adresy = value; }
                }

                public Klient()
                { 
                
                }

                public Klient(int id)
                {
                        _id = id;
                        var zm = (from Cust in dbcontext.Customer
                                  where Cust.CustomerID == id
                                  select new
                                  {
                                          //iD = Cust.CustomerID,
                                          nazwaFirmy = Cust.CompanyName,
                                          imieKontakt = Cust.FirstName,
                                          nazwiskoKontakt = Cust.LastName,
                                          telefon = Cust.Phone,
                                          email = Cust.EmailAddress
                                  }).First();
                        //_id = zm.iD;
                        _email = zm.email;
                        _nazwaFirmy = zm.nazwaFirmy;
                        _imiePrzedstawiciela = zm.imieKontakt;
                        _nazwiskoPrzedstawiciela = zm.nazwiskoKontakt;
                        _telefon = zm.telefon;
                        _iloscZamowien = (int)dbcontext.SalesOrderHeader.Where(x => x.CustomerID == id).Count();
                        //_sumaZamowien = (double)dbcontext.SalesOrderHeader.Where(x => x.CustomerID == id).Select(x => x.TotalDue).Sum();
                        var zm1 = (from Orders in dbcontext.SalesOrderHeader
                                   where Orders.CustomerID == id
                                   select Orders.TotalDue);
                        if (0 == zm1.Count()) _sumaZamowien = 0;
                        else _sumaZamowien = (double)zm1.Sum();
                        _adresy = null;

                }
                public Klient(string email, string nazwafirmy, string imieprzedstawiciela, string nazwiskoprzedstawiciela, string telefon, List<Adres> adresy)
                {
                        _email = email;
                        _nazwaFirmy = nazwafirmy;
                        _imiePrzedstawiciela = imieprzedstawiciela;
                        _nazwiskoPrzedstawiciela = nazwiskoprzedstawiciela;
                        _telefon = telefon;
                        _adresy = adresy;
                }
                public bool Dodaj()
                {
                        try
                        {
                                Customer cust = new Customer();
                                cust.CompanyName = _nazwaFirmy;
                                cust.EmailAddress = _email;
                                cust.FirstName = _imiePrzedstawiciela;
                                cust.LastName = _nazwiskoPrzedstawiciela;
                                cust.Phone = _telefon;
                                cust.PasswordHash = "BBBB";
                                cust.PasswordSalt = "CCCC";
                                cust.ModifiedDate = DateTime.Now;
                                cust.rowguid = new Guid(GenerateString(32));

                                dbcontext.Customer.AddObject(cust);
                                dbcontext.SaveChanges();

                                _id = cust.CustomerID;

                                if (_adresy.Count() > 0)
                                {
                                        foreach (Adres adr in _adresy)
                                        {
                                                DodajAdres(adr);
                                        }
                                }
                                return true;
                        }
                        catch (Exception)
                        {
                                return false;
                        }
                }
                public List<Adres> PobierzAdesy()
                {
                        List<int> ListaAdresow = (from CustAdres in dbcontext.CustomerAddress
                                                  where CustAdres.CustomerID == _id
                                                  select CustAdres.AddressID).ToList();
                        List<Adres> LA = new List<Adres>();

                        foreach (int adres in ListaAdresow)
                        {
                                LA.Add(new Adres(adres));
                        }
                        _adresy = LA;
                        return _adresy;
                }
                public void Zapisz()
                {
                        var klient = (from Cust in dbcontext.Customer
                                      where Cust.CustomerID == _id
                                      select Cust).First();
                        klient.CompanyName = _nazwaFirmy;
                        klient.EmailAddress = _email;
                        klient.FirstName = _imiePrzedstawiciela;
                        klient.LastName = _nazwiskoPrzedstawiciela;
                        klient.Phone = _telefon;

                        dbcontext.SaveChanges();
                }
                public void DodajAdres(Adres adr)
                {
                        Guid gd = new Guid(GenerateString(32));
                        Address add = new Address
                        {
                                AddressLine1 = adr.Ulica,
                                City = adr.Miasto,
                                CountryRegion = adr.Panstwo,
                                PostalCode = adr.KodPocztowy,
                                StateProvince = adr.Stan,
                                rowguid = gd,
                                ModifiedDate = DateTime.Now
                        };

                        dbcontext.Address.AddObject(add);
                        dbcontext.SaveChanges();

                        CustomerAddress CA = new CustomerAddress
                        {
                                rowguid = new Guid(GenerateString(32)),
                                ModifiedDate = DateTime.Now,
                                CustomerID = _id,
                                AddressID = add.AddressID,
                                AddressType = "Typ1"
                        };

                        dbcontext.CustomerAddress.AddObject(CA);
                        dbcontext.SaveChanges();

                        //adr.AddressLine1 = _ulica;
                        //adr.City = _miasto;
                        //adr.CountryRegion = _panstwo;
                        //adr.PostalCode = _kodPocztowy;
                        //adr.StateProvince = _stan;
                }

                public void UsunAdres(Adres adr)
                {
                        //Reguły relacji nie pozwalają na usuwanie
                        //var a = (from adres in dbcontext.CustomerAddress
                        //           where adres.AddressID == adr.Id && adres.CustomerID == _id
                        //           select adres).First();
                        //dbcontext.CustomerAddress.DeleteObject(a);
                        //var b = (from adres in dbcontext.Address
                        //         where adres.AddressID == adr.Id
                        //         select adres).First();
                        //dbcontext.Address.DeleteObject(b);
                        //dbcontext.SaveChanges();
                }
                private static string GenerateString(int ilosc)
                {
                        string znaki = "0123456789";
                        char[] chars = new char[ilosc];
                        Random rd = new Random();

                        for (int i = 0; i < ilosc; i++)
                        {
                                chars[i] = znaki[rd.Next(0, znaki.Length)];
                        }

                        return new string(chars);
                }
        }
}
